import axios from 'axios';
import { ElMessage } from 'element-plus'; // 导入 ElMessage
import Logger from '../utils/logger';

// 使用环境变量或默认值
// 注意：确保正确配置后端地址 - 使用HTTPS协议
const baseURL = window.VUE_APP_API_URL || 'https://zmyzmy.xin/api'; // 使用HTTPS协议
console.log('初始化API配置，连接到:', baseURL);

// 创建 axios 实例
const api = axios.create({
  baseURL: baseURL,
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'X-Requested-With': 'XMLHttpRequest' // 添加标准的XHR头
  },
  withCredentials: false, // 不跨域携带cookie
  // 忽略HTTPS证书错误
  validateStatus: function (status) {
    return status >= 200 && status < 500; // 默认值
  }
});

// 全局标记，控制是否使用模拟数据（仅使用 'useMockData' 键，保持一致性）
// eslint-disable-next-line no-unused-vars
const useMockData = () => {
  // 默认情况下使用数据
  if (!localStorage.getItem('useMockData')) {
    localStorage.setItem('useMockData', 'true');
  }
  return localStorage.getItem('useMockData') === 'true';
};

// 测试连接 - 使用axios而不是fetch
api.get('/auth/test')
  .then(() => {
    // 成功连接时不输出日志
  })
  .catch(error => {
    Logger.error(`API测试连接失败: ${error.message}`);
  });

// 请求拦截器
api.interceptors.request.use(
  config => {
    // 记录API请求
    Logger.api(`发送请求: ${config.method.toUpperCase()} ${config.url}`);
    
    // 确保所有请求都有正确的Content-Type和Accept头
    config.headers['Content-Type'] = 'application/json';
    config.headers['Accept'] = 'application/json';
    
    // 对于登录请求，确保不使用备用数据
    if (config.url.includes('/auth/login')) {
      // 登录请求始终使用真实API
      Logger.debug('处理登录请求，使用真实API');
    }
    
    // 从 localStorage 获取 token
    const token = localStorage.getItem('token');
    
    // 只有在token存在且不是登录请求时才添加Authorization头
    if (token && !config.url.includes('/auth/login')) {
      // 确保token格式正确包含Bearer前缀，移除多余空格
      const tokenValue = token.trim();
      const authHeader = tokenValue.startsWith('Bearer ') ? tokenValue : `Bearer ${tokenValue}`;
      config.headers.Authorization = authHeader;
      
      // 检查token是否过期
      const tokenExpires = localStorage.getItem('tokenExpires');
      if (tokenExpires && parseInt(tokenExpires) < Date.now()) {
        // Token过期，可以自动导航到登录页面
        if (!window.location.pathname.includes('/login')) {
          localStorage.removeItem('token');
          window.location.href = '/login';
          return Promise.reject(new Error('认证已过期，请重新登录'));
        }
      }
      
      try {
        // 尝试提取并解析token用于调试
        const tokenPart = token.startsWith('Bearer ') ? token.substring(7) : token;
        if (tokenPart.split('.').length === 3) {
          // 确认是有效的JWT格式(header.payload.signature)
          // 解析但不使用payload
          JSON.parse(atob(tokenPart.split('.')[1]));
        }
      } catch (e) {
        Logger.error('Token解析失败');
      }
    }
    
    return config;
  },
  error => {
    Logger.error('请求拦截器错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
api.interceptors.response.use(
  response => {
    // 记录API响应
    Logger.api(`API响应: ${response.config.url}`, { status: response.status });
    
    // 如果响应成功，并且响应体中有数据，则直接返回数据部分
    return response.data;
  },
  error => {
    let message = '请求发生错误，请稍后再试'; // 默认错误消息

    if (error.response) {
      // 服务器返回了响应，但状态码不在 2xx 范围内
      const status = error.response.status;
      const responseData = error.response.data;
      let serverMessage = '';

      // 尝试从 error.response.data 中提取后端返回的错误信息
      if (responseData && typeof responseData === 'object') {
        if (responseData.message) {
          serverMessage = responseData.message;
        } else if (responseData.msg) {
          serverMessage = responseData.msg;
        } else if (responseData.error) {
          serverMessage = responseData.error;
        }
      } else if (typeof responseData === 'string' && responseData.length > 0 && responseData.length < 200) { 
        // 如果响应数据是简短字符串，也可能是错误信息
        serverMessage = responseData;
      }

      // 只在开发环境记录详细的API错误信息
      if (process.env.NODE_ENV === 'development') {
        Logger.error('API错误:', { 
          status,
          url: error.config.url,
          response: responseData
        });
      }
      
      if (status === 401) {
        // 尝试解析token信息
        const token = localStorage.getItem('token');
        if (token && token.split('.').length === 3) {
          try {
            const tokenData = token.startsWith('Bearer ') ? token.substring(7) : token;
            const payload = JSON.parse(atob(tokenData.split('.')[1]));
            // 开发环境下才记录token信息
            if (process.env.NODE_ENV === 'development') {
              Logger.debug('Token payload:', payload);
            }
          } catch (e) {
            // 错误处理但不输出详细日志
          }
        }
      }
      
      switch (status) {
        case 400:
          message = `请求参数错误 (400)${serverMessage ? ': ' + serverMessage : ''}`;
          break;
        case 401:
          message = `未授权 (401)${serverMessage ? ': ' + serverMessage : '，会话已过期或无效'}`;
          // 如果不是登录请求导致的401错误，才自动跳转到登录页
          if (!error.config.url.includes('/auth/login')) {
            localStorage.removeItem('token'); // 清除无效token
            // 避免在已是登录页的情况下重复跳转
            if (!window.location.pathname.endsWith('/login')) {
              window.location.href = '/login'; // 跳转到登录页
            }
          }
          break;
        case 403:
          message = `禁止访问 (403)${serverMessage ? ': ' + serverMessage : ''}`;
          break;
        case 404:
          message = `请求的资源未找到 (404): ${error.config.url}`;
          break;
        case 500:
          message = `服务器内部错误 (500)${serverMessage ? ': ' + serverMessage : ''}`;
          break;
        case 502:
          message = '网关错误 (502)';
          break;
        case 503:
          message = '服务不可用 (503)';
          break;
        case 504:
          message = '网关超时 (504)';
          break;
        default:
          message = `请求失败 (${status})${serverMessage ? ': ' + serverMessage : ''}`;
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应 (例如网络问题)
      message = '网络连接超时或服务器未响应，请检查您的网络连接。';
      if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
        message = '请求超时，请稍后重试。';
      }
    } else {
      // 发送请求时出了点问题 (例如 Axios 配置错误)
      message = `请求发送失败: ${error.message}`;
    }

    // 使用 ElMessage 显示错误提示
    // 仅在非401错误或当前不在登录页时显示，避免登录页重复提示或跳转时提示
    if (!(error.response && error.response.status === 401) && !window.location.pathname.endsWith('/login')) {
      ElMessage.error({ message: message, duration: 3000 });
    }

    return Promise.reject(error); // 将错误继续传递，以便业务代码可以捕获和处理
  }
);

export default api;
